home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / dev / asm / Asm_Course2.lha / Teil29.TXT < prev    next >
Text File  |  1992-09-02  |  11KB  |  259 lines

  1.           A S S E M B L E R - K U R S       (c)  Jeff Kandle 1990
  2.  
  3.                                 29.Teil...
  4.  
  5. Wieder sind ein paar Tage ins Land gezogen. Ich moechte behaupten das wir
  6. alle aelter geworden sind. Naja, weiter gehts mit frischem Schwung.
  7.  
  8. Ich hoffe ihr kommt mit dem SinusscrolleransatzSource klar. Muesstet ihr
  9. aber schon schaffen. Positionen aus Tabellen lesen und bedingte Schleifen
  10. programmieren koennt ihr ja schon.
  11.  
  12. So, dann will ich mal weiter machen mit den Bobs.
  13. Vielleicht haben einige schon versucht die neue Verknuepfung auf die Bobs
  14. anzusetzen. Duerfte bei einplanebobs auch geklappt haben. Aber sobald
  15. mehrere Planes ins Spiel kamen, sah es etwas bunter aus als wie es haette
  16. aussehen sollen.
  17. Nun das ist eigentlich etwas verwunderlich, denn da wo etwas vom Bobs
  18. gesetzt war, ist auch in der Quelle etwas gesetzt, und da wo nichts ist, da
  19. wurde ein Bit vom Hintergrund eingesetzt.
  20.  
  21. Warum Funktioniert es nicht ?
  22.  
  23. Ganz klar...Wenn ein Bit der Quelle Bob nicht gesetzt ist heisst das noch
  24. lange nicht das da nichts gesetzt ist. Es koennte ja eine Plane weiter
  25. etwas gesetzt sein. Und da die Bits die Farbgebung der Bobs sind, macht da
  26. ein dazwischengeschobenes Bit, ne ganze Menge aus.
  27.  
  28. Was ist also zu tun ?
  29.  
  30. Nun wir muessten neben dem Normalen Bobs noch eine Plane oder ein Abbild
  31. des Bobs haben in dem alle gesetzten Bits, egal in welcher Plane,
  32. verzeichnet sind. Dieses verzeichnis koennten wir dann als grundlage fuer
  33. die verknuepfung nehmen. Die verknuepfungen saehe dann ungefaehr so aus.
  34.  
  35. 1.  D  =  A  wenn  C = 1 und B = 0   2.  D = B wenn C = 0
  36.  
  37. Das heisst das C nur noch ausschlaggeber fuer die Aktion ist.
  38.  
  39. Wir erreichen so ein verzeichnis indem wir einen Bob mit 8 Farben im 16
  40. Farben Modus malen und dabei nur die Farben 8 - 15 benutzen. die 4. Plane
  41. koennen wir dann als verzeichnis benutzen, da in ihr Automatisch alle
  42. gesetzten Bits verzeichnet sind, schlau was ?
  43.  
  44. Naja, da solche verknuepfungen auch ne menge Zeit kosten, muessen wir auch
  45. ein paar Tricks und Kniffe beherschen die uns schneller werden lassen.
  46.  
  47. Die Tips sind zwar nicht alle von mir, sind aber trotzdem gut. Ich setze immer
  48. noch eine erklaerung darunter.
  49.  
  50. 1. Man vermeide 32-Bit-Immediate-Werte.
  51.  
  52. Also, man sollte nicht mit direkten Langwoertern arbeiten.
  53.  
  54. Beispiel: Wenn man ein Rotierende Schleife programmieren will, dann sind
  55. die Zeiger (A0,A1) um die Laenge des Elements voneinander verschoben. Die
  56. Initialisierung saehe normal dann so aus.
  57.  
  58.         Move.l  #$40000,A0
  59.         Move.l  #$40004,A1
  60.  
  61. Scheusslich...Wir aber geben der tabelle einen Namen und initialisieren so..
  62.  
  63.         Lea     Tabelle(Pc),A0
  64.         Move.l  A0,A1
  65.         Add.l   #4.w,A1
  66.  
  67. Das ist sehr viel kuerzer, und damit auch gleichzeitig schneller.
  68.  
  69. 2. Man vermeide 32-Bit-Operanden zusammen mit Adressregistern.
  70.  
  71. Solange es irgendwie geht sollte man ueberhaupt Langwoerter nicht benutzen,
  72. denn sind sind fuer den MC 68000 sehr schwer zu holen, da er ja nur ein
  73. Word pro Lungenzug aus dem Speicher ziehen kann.
  74.  
  75. 3. Man vermeide 32-Bit-Absolut Adressen...
  76.  
  77. Also die Source-Kot zeile
  78.  
  79.         Move.l  $40000,$50000
  80.  
  81. ist Tabu....Sie dauert haarstraeubend lange.
  82.  
  83. 4. Man vermeide die Mul- und Div anweisungen..
  84.  
  85. Wenn man ein bisschen scharf ueberlegt kommt man oft auf einen anderen Weg
  86. an das gewuenschte Ergebnis zu kommen.
  87.  
  88. 5. Was der Verfassers jetzt meint weiss ich nicht, aber er sagt das man die
  89. Quick anweisung des MC 68000 vergessen sollte. Naja er wird schon seine
  90. gruende haben. Ich kann nur sagen das ich sie gerne benutze, schon alleine
  91. weil sie so kurz ist.
  92.  
  93. 6. Was ich aber schon gesagt habe ist das man die Clr- anweisung komplett
  94. aus den Assemblerbuechern streichen sollte. Ein Befehl mit nur einen
  95. Parameter der ganz genau weiss was er zutun hat, und der dann so lange
  96. dafuer braucht, der gehoert einfach nicht in ein gutes Programm.
  97. Desweiteren fuehrt er, weiss ich warum seine Anweisung zweimal aus. Das ist
  98. bei Strobe Registern nicht gerade das wahre, oder ?
  99.  
  100. Hier mal ein aufstellung von einfachen Befehlen, und wie man diese durch
  101. andere Adressierungsarten verkuerzt oder verschnellert, oder beides !
  102.  
  103. L1:     Move.l  #1,D0                   6 Bytes         12 Zyklen
  104.  
  105. L2:     Add.l   #2,A0                   6 Bytes         16 Zyklen
  106.  
  107. L3:     Move.l  #3,Datavariable         10 Bytes        28 Zyklen
  108.  
  109. L4:     Muls.w  #10,D0                  4 Bytes         70 Zyklen
  110.  
  111. L5:     Clr.l   D0                      2 Bytes         6 Zyklen
  112.  
  113.  
  114. Durch geschickten einsatz der moeglichkeiten, erreicht man dasselbe
  115. schneller und kuerzer so...
  116.  
  117. L1:     Moveq   #1,D0                   2 Bytes          4 Zyklen
  118.  
  119. L2:     Addq.w  #2,A0                   2 Bytes          8 Zyklen
  120.  
  121. L3a:    Moveq   #3,D0                   2 Bytes          4 Zyklen
  122.         Move.l  D0,Datavariable         6 Bytes         20 Zyklen
  123.                                         -------         ---------
  124.                                         8 Bytes         24 Zyklen
  125.  
  126. L3b:    Moveq   #3,D0                   2 Bytes          4 Zyklen
  127.         Move.l  D0,(a4)                 4 Bytes         16 Zyklen
  128.                                         -------         ---------
  129.                                         6 Bytes         20 Zyklen
  130.  
  131. L4:     Move.l  D0,D1                   2 Bytes          4 Zyklen
  132.         Lsl.l   #2,D1                   2 Bytes         12 Zyklen
  133.         Add.l   D1,D0                   2 Bytes          8 Zyklen
  134.         Add.l   D0,D0                   2 Bytes          8 Zyklen
  135.                                         -------         --------
  136.                                         8 Bytes         32 Zyklen
  137.  
  138. L5:     Moveq   #0,d0                   2 Bytes          4 Zyklen
  139.  
  140.  
  141. 7. Wenn man fuer eine 32-Bit-Konstante MOVEQ verwenden kann, soll man es
  142. auch tun.
  143.  
  144. Folgende Routine....
  145.  
  146.         And.l   #15,D2                   6 Bytes        16 Zyklen
  147.         Or.l    #2,D3                    6 Bytes        16 Zyklen
  148.         Sub.l   #28,D4                   6 Bytes        16 Zyklen
  149.         Cmp.l   #1,D1                    6 Bytes        14 Zyklen
  150.                                         --------        ---------
  151.                                         24 Bytes        62 Zyklen
  152.  
  153. Werden kuerzer und schneller, so geschrieben
  154.  
  155.         Moveq   #15,D0                   2 Bytes         4 Zyklen
  156.         And.l   D0,D2                    2 Bytes         8 Zyklen
  157.         Moveq   #2,D0                    2 Bytes         4 Zyklen
  158.         Or.l    D0,D3                    2 Bytes         8 Zyklen
  159.         Moveq   #28,D0                   2 Bytes         4 Zyklen
  160.         Sub.l   D0,D4                    2 Bytes         8 Zyklen
  161.         Moveq   #1,D0                    2 Bytes         4 Zyklen
  162.         Cmp.l   D0,D1                    2 Bytes         8 Zyklen
  163.                                         --------        ---------
  164.                                         16 Bytes        48 Zyklen
  165.  
  166. Allerdings muss man nicht immer auf Register zurueckgreifen wenn man
  167. groessere Werte Addieren will und man die Grenze der Quick-anweisung
  168. sprengt.
  169.  
  170. Anstatt
  171.  
  172.         Sub.l   #10,D0                   6 Bytes        16 Zyklen
  173.  
  174. Schreibt man genauso schnell, aber im Code kuerzer.
  175.  
  176.         Subq.l  #8,D0                    2 Btyes         8 Zyklen
  177.         Subq.l  #2,D0                    2 Bytes         8 Zyklen
  178.                                         --------        ---------
  179.                                          4 Zyklen       16 Zyklen
  180.  
  181. Man kann sich aber auch mit dem Moveq-Befehl behelfen wenn es um Grosse
  182. werte geht. Ein Beispiel waere anstatt
  183.  
  184.         Move.l  #$10000,D0               6 Bytes        12 Zyklen
  185.  
  186. schreibt man
  187.  
  188.         Moveq   #1,D0                    2 Bytes         4 Zyklen
  189.         Swap    D0                       2 Bytes         4 Zyklen
  190.                                         --------        ---------
  191.                                          4 Bytes         8 Zyklen
  192.  
  193. 8. Man verwende fuer Adressregister die .W form wenn moeglich.
  194.  
  195. Also    Move.l Execbase.w,a6
  196.  
  197. 9. Man fuehre Operationen, wenn moeglich, in Adressregistern aus. Soll
  198. etwa eine Konstante in ein Adressregister geladen werden, koennte dies wie
  199. folgt codiert werden:
  200.  
  201.         Move.l  #502,A1                  6 Bytes        12 Zyklen
  202.  
  203. Dasselbe kann man aber auch mit der Lea-Anweisung erreichen.
  204.  
  205.         Lea     502.w,A1                 4 Bytes         8 Zyklen
  206.  
  207.  
  208. Ein weiterer Tip ist, das man ruhig mehere gleiche Kommandos hintereinander
  209. schreiben kann, wenn man so schneller auf das Ergebnis kommen kann. Also
  210. anstatt..
  211.  
  212.         Exg     A0,D0                    2 Bytes         6 Zyklen
  213.         Lsl.l   #2,D0                    2 Bytes        12 Zyklen
  214.         Exg     D0,A0                    2 Bytes         6 Zyklen
  215.                                         --------        ---------
  216.                                          6 Bytes        24 Zyklen
  217.  
  218. Das Exg ist scheinbar noetig, da man ja nur Datenregister `Shiften` kann.
  219.  
  220. Der Ersatz fuer diese Zeilen waere einfacher....
  221.  
  222.         Add.l   A0,A0                    2 Bytes         8 Zyklen
  223.         Add.l   A0,A0                    2 Bytes         8 Zyklen
  224.                                         --------        ---------
  225.                                          4 Bytes        16 Zyklen
  226.  
  227. Und da wir gerade beim Thema Shifts sind, hier ein paar einfache Regeln.
  228.  
  229. 10a: Wenn die Anzahl der Schiebepositionen groesser als 15 ist, fuehre man
  230. eine Swap-anweisung durch und Subtrahiere 16 von der anzahl der
  231. durchzufuehrenden Shifts
  232.  
  233. 10b: Wenn die Zahl 1 ist, und es sich um einen Links-Shift handelt, dann
  234. ist ein Add-anweisung vorzuziehen.
  235.  
  236. So, diese Tips und Tricks hier, setze ich meistens bei meinen Programmen
  237. ein, und kann euch sagen das sie wirklich gut sind. Allerdings moechte ich
  238. euch auch ein paar Tips geben, die ich beim Codes eines Intro`s benutzen.
  239.  
  240. Wenn es um Aufwendige Teil-Routinen geht, dann Speichere ich den
  241. Source.Code ab und loeschen den Speicher. Dann fange ich mit der Routine
  242. an. Da ich weiss was als Ergebnis bei einem Ganz bestimmten Wert rauskommen
  243. muss, kann ich jeden neuen Befehl beobachten. Dazu koennt ihr die Register
  244. ausgabe beim Ruecksprung in den Seka benutzen. Lasst euch Zeit damit, denn
  245. so eine Routine die z.B Die Bobkoordinaten, oder Logopositionen anhand
  246. eines Bytes errechnet kommt ohne Muls und Divs anweisungen meist nicht aus.
  247. Wenn man allerdings die Tips beruecksichtigt kommt man noch ziemlich billig
  248. davon.
  249.  
  250. Wenn ihr allerdings groessere Programme selber schreiben solltet, dann ist
  251. es besser ihr schreibt euch die Gliederung bis in sehr kleine Teilprobleme
  252. auf. Dann koennt ihr jedes kleine Progamm einzeln schreiben, und braucht
  253. sie dann nur noch anzupassen.
  254.  
  255. Soviel fuer Heute
  256.  
  257.                 Jeff Kandle
  258.  
  259.